/*******************************************************************************
blogger-cli Консольные инструменты по работе с blogger.com
(с) Камнев Георгий Павлович 2011 GPLv2

Данная программа является свободным программным обеспечением. Вы вправе
распространять ее и/или модифицировать в соответствии с условиями версии 2
либо по вашему выбору с условиями более поздней версии
Стандартной Общественной Лицензии GNU, опубликованной Free Software Foundation.

Мы распространяем данную программу в надежде на то, что она будет вам полезной,
однако НЕ ПРЕДОСТАВЛЯЕМ НА НЕЕ НИКАКИХ ГАРАНТИЙ,
в том числе ГАРАНТИИ ТОВАРНОГО СОСТОЯНИЯ ПРИ ПРОДАЖЕ
и ПРИГОДНОСТИ ДЛЯ ИСПОЛЬЗОВАНИЯ В КОНКРЕТНЫХ ЦЕЛЯХ.
Для получения более подробной информации ознакомьтесь
со Стандартной Общественной Лицензией GNU.

Вместе с данной программой вы должны были получить экземпляр
Стандартной Общественной Лицензии GNU.
Если вы его не получили, сообщите об этом в Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*******************************************************************************/

package tv.cofe.blogger;

import java.io.File;
import java.nio.charset.Charset;
import java.util.Date;
import org.gocha.collection.Iterators;
import org.gocha.files.FileUtil;
import org.gocha.inetools.http.FileCharsetDetector;
import org.gocha.xml.XMLUtil;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Представляет из себя html файл
 * @author gocha
 */
public class HtmlFile
{
    protected HtmlFile (){
    }
    
    private File file = null;
    private org.w3c.dom.Node xmlNode = null;
    
    /**
     * Читает Html файл, определяет автоматом кодировку из тега meta...
     * @param file Файл
     * @return Файл
     */
    public static HtmlFile read(File file){
        if ( file== null )
            throw new IllegalArgumentException("file==null");
        if( !file.exists() )
            throw new Error(CLI.messages().fileNotExists(file));
        if( !file.canRead() )
            throw new Error(CLI.messages().fileCantRead(file));
        if( !file.isFile() )
            throw new Error(CLI.messages().isNotFile(file));
        
        FileCharsetDetector detect = new FileCharsetDetector(file);
        Charset cs = detect.getCharset();
        if( cs==null ){
            cs = Charset.defaultCharset();
            System.out.println(CLI.messages().usedDefaultCharset(cs));
        }
        
        HtmlFile hfile = new HtmlFile();
        
        String fileBody = FileUtil.readAllText(file, cs);
        
        // clean html
        hfile.xmlNode = PostHelper.parseHtml(fileBody);
        
        hfile.file = file;
        
        return hfile;
    }

    /**
     * Возвращает дату модификации файла
     * @return Дата модификации
     */
    public Date getLastModifiedDate() {
        long fdate = file.lastModified();
        if( fdate==0 )fdate = new Date(fdate).getTime();
        return new Date(fdate);
    }

    /**
     * Возвращает файл html
     * @return файл html
     */
    public File getFile() {
        return file;
    }

    /**
     * Возвращает XML DOM для html
     * @return xml node
     */
    public Node getXMLNode() {
        return xmlNode;
    }
    
    /**
     * Возвращает заголовок из /html/head/title
     * @return Заголовок или null
     */
    public String getTitle(){
        String title = XMLUtil.xpathString("/html/head/title/text()", xmlNode);
        return title;
    }
    
    /**
     * Возвращает тело html из /html/body/*; либо все содержимое если нет /html/body
     * @return Тело
     */
    public String getBody(){
        Node nBody = XMLUtil.xpathNode("/html/body", xmlNode);
        if( nBody!=null ){
            StringBuilder sb = new StringBuilder();
            if( nBody.hasChildNodes() ){
                for( Node n : Iterators.xmlNodes(nBody.getChildNodes()) ){
                    sb.append(XMLUtil.toXMLString(n));
                }
            }
            return sb.toString();
        }
        
        NodeList nlBody = XMLUtil.xpathNodeSet("/html/body/*", xmlNode);
        if( nlBody!=null ){
            return XMLUtil.toXMLString(nlBody);
        }
        String all = XMLUtil.toXMLString(xmlNode);
        return all;
    }
}
